home *** CD-ROM | disk | FTP | other *** search
/ FM Towns: Free Software Collection 8 / FM Towns Free Software Collection 8.iso / t_os / artemis / artsrc2 / imath.h < prev    next >
C/C++ Source or Header  |  1994-06-01  |  8KB  |  195 lines

  1. /*************************************************************************
  2.     imath.h
  3.     
  4.     固定小数演算に関する宣言
  5.         math2.h, decimal.h, vector.h をまとめたもの
  6. *************************************************************************/
  7.  
  8. extern int isqrt(int);    // 固定小数の平方根(メチャ速い)  by MAT (TSG)
  9.  
  10. /*--------------------------------------------------------*/
  11. /*                        math2.h                         */
  12. /*--------------------------------------------------------*/
  13. /*
  14. *            math.h の補助            ver 0.3
  15. */
  16.  
  17. #define sign( a )        (  ( (a)>0 ) ? (1) : ( ((a)<0)?(-1):(0) )  )
  18. #define max( a, b )        ( ( (a) > (b) ) ? (a) : (b) )
  19. #define min( a, b )        ( ( (a) < (b) ) ? (a) : (b) )
  20. #undef ads
  21. // #define abs( a )        ( ( (a) >  0  ) ? (a) : (-(a)) )
  22.  
  23. #define DECIMAL 10        /*    これは下位の 10bit shift の意味。 したがって本当の単位は 2^10。 整数部 2^22。        */
  24. #define DUNIT     1024    /* = 2^10 */
  25.  
  26. /* 整数固定少数変換 */
  27. #define IntToDeci( i )    ( (i) << DECIMAL )
  28. #define DeciToInt( d )    ( (d) >> DECIMAL )
  29. /* 固定少数の演算の補正 Macro。 (まとてやったほうが速いから別にしておく) */
  30. #define AdjMulDeci( d )    ( (d) >> DECIMAL )
  31. #define AdjDivDeci( d )    ( (d) << DECIMAL )
  32. #define MulDeci( a, b ) ( (a)*(b) >> DECIMAL )
  33. #define DivDeci( a, b ) ( ((a) << DECIMAL) /(b) )
  34.  
  35. /*--------------------------------------------------------*/
  36. /*                       decimal.h                        */
  37. /*--------------------------------------------------------*/
  38. /*
  39. *    10bit固定小数演算        v. 1.0
  40. *    math.h を仮定する。
  41. */
  42.  
  43. /*
  44. *    x, y は固定少数に限定するよう, 注意して使う。
  45. *    足し算, 引き算はそのまま。 dummy で作ってもいいかもしれない。
  46. */ 
  47. #define multi( x, y )  ( (x) * (y) >> DECIMAL )
  48. #define div( x, y )    ( (x) / (y) << DECIMAL )
  49.  
  50. /*
  51. *    int multi( int x, int y ) { return x*y >> DECIMAL ;}    
  52. *    int div (int x,int y)     { return x/y << DECIMAL ;}
  53. */
  54.  
  55. extern int powd( int, int )            ;
  56.  
  57. /*
  58. *    小さい変数のための三角関数( 小さくマクローリン展開しただけ。 べきの展開の大きさは個別に tune せよ。)
  59. *    返り値も固定少数表現の整数である。 (COS for Small Decimal)
  60. */
  61. #define cossd( x )  ( DUNIT - powd( (x), 2 )/2 + powd( (x), 4 )/24 - powd( (x), 6 )/720 )
  62. #define sinsd( x )  ( (x) - powd( (x), 3 )/6 + powd( (x), 5 )/120 - powd( (x), 7)/5040 )
  63.  
  64. /*
  65. *    三角数列。 そのまま cos, sin の関数とみなす。
  66. */
  67. #if 0
  68. extern int cos512[1024];
  69. extern int sin512[1024];
  70. extern int acos512[2048+1];
  71. extern int asin512[2048+1];
  72. #define  cos512( x )    (cos512[x])
  73. #define  sin512( x )    (sin512[x])
  74. #define acos512( x )    (acos512[(x)+DUNIT])
  75. #define asin512( x )    (asin512[(x)+DUNIT])
  76. #endif
  77. /* -DUNIT は負に対応するため, 数列は原点をずらして持っている。 */
  78.  
  79. /*--------------------------------------------------------*/
  80. /*                        vector.h                        */
  81. /*--------------------------------------------------------*/
  82. /*
  83. *                Vector演算関数                ver 1.12
  84. *
  85. *    math.h, math2.h を仮定する。
  86. */
  87.  
  88. /*
  89. *        型宣言
  90. */
  91. struct vect2i { int x ; int y };                /* 二次元整数vector */ 
  92. struct vect3i { int x ; int y ; int z };        /* 三次元整数vector */ 
  93. struct vect3p { int x; int y ; int z };         /* 三次元固定少数vector */
  94. struct vect3f { float x ; float y ; float z };    /* 三次元浮動少数vector */
  95. struct matrix3i    { int xx ; int xy ; int xz ;
  96.                   int yx ; int yy ; int yz ;
  97.                   int zx ; int zy ; int zz ; };    /* 3×3整数行列 */
  98. struct matrix3p    { int xx ; int xy ; int xz ;
  99.                   int yx ; int yy ; int yz ;
  100.                   int zx ; int zy ; int zz ; };    /* 3×3固定少数行列 */
  101. struct surfi {
  102.     struct vect3i norl;                            /* 法線 (NORmal Line) */
  103.     struct vect3i s0;                            /* 面上の一点 */
  104.     int c;                                        /* 定数 */
  105. };
  106. struct surfp {
  107.     struct vect3p norl;                            /* 法線 (NORmal Line) */
  108.     struct vect3p s0;                            /* 面上の一点 */
  109.     int c;                                        /* 固定少数の定数 */
  110. };
  111.  
  112.  
  113.  
  114. /*
  115. *        固定少数整数変換関数
  116. */
  117. extern struct vect3i DeciToInt3V( struct vect3p p );
  118. extern struct vect3p IntToDeci3V( struct vect3i p );
  119. extern struct matrix3i DeciToInt3M( struct matrix3p A );
  120. extern struct matrix3p IntToDeci3M( struct matrix3i A );
  121. /*
  122. *        vector 演算関数
  123. */
  124. #define MakeZero2i( p )            { (p).x=0; (p).y=0; }
  125. #define MakeZero2p( p )            { (p).x=0; (p).y=0; }
  126. extern struct vect2i scalar2i( int, struct vect2i )    ;
  127. extern struct vect2i inscalar2i( int, struct vect2i );
  128. extern struct vect2i scalar2p( int, struct vect2i );
  129. extern struct vect2i add2i( struct vect2i, struct vect2i );
  130. extern struct vect2i subtr2i( struct vect2i, struct vect2i );
  131. extern struct vect2i rshift2i( struct vect2i, int );
  132. extern struct vect2i lshift2i( struct vect2i, int );
  133. #define iszero2( p )            ( (p).x==0 && (p).y==0 )
  134. #define abs2i( p )                ( (int)sqrt( (p).x*(p).x + (p).y*(p).y ) )
  135. #define innerpro2i( p, q )        ( (p).x*(q).x + (p).y*(q).y )
  136. #define innerpro2p( p, q )        AdjMulDeci( (p).x*(q).x + (p).y*(q).y )
  137. #define issame2v( p, q )        ( (p).x==(q).x && (p).y==(q).y )
  138.  
  139. #define MakeZero3i( p )            { (p).x=0; (p).y=0; (p).z=0; }
  140. #define MakeZero3p( p )            { (p).x=0; (p).y=0; (p).z=0; }
  141. extern struct vect3i scalar3i( int, struct vect3i );
  142. extern struct vect3i scalar3p( int, struct vect3i );
  143. extern struct vect3i inscalar3i( int, struct vect3i );
  144. extern struct vect3i add3i( struct vect3i, struct vect3i );
  145. extern struct vect3p add3p( struct vect3p x1, struct vect3p x2 );
  146. extern struct vect3i subtr3i( struct vect3i, struct vect3i );
  147. extern struct vect3p subtr3p( struct vect3p x1, struct vect3p x2 );
  148. extern struct vect3i outerpro3i( struct vect3i, struct vect3i );
  149. extern struct vect3p outerpro3p( struct vect3p x1, struct vect3p x2 );
  150. extern struct vect3i rshift3i( struct vect3i p, int i );
  151. extern struct vect3i lshift3i( struct vect3i p, int i );
  152. extern struct vect3p rshift3p( struct vect3p p, int i );
  153. extern struct vect3p lshift3p( struct vect3p p, int i );
  154. #define issame3v( p, q )        ( (p).x==(q).x && (p).y==(q).y && (p).z==(q).z )
  155. #define ispara3( p, q )            ( ( (p).x*(q).y - (p).y*(q).x )==0 && ( (p).x*(q).z - (p).z*(q).x )==0 && ( (p).y*(q).z - (p).z*(q).y )==0 )
  156. #define iszero3( p )            ( (p).x==0 && (p).y==0 && (p).z==0 )
  157. #define det3( p, q, r )            ( (p).x*(q).y*(r).z + (q).x*(r).y*(p).z + (r).x*(p).y*(q).z - (p).x*(r).y*(q).z - (q).x*(p).y*(r).z - (r).x*(q).y*(p).z )
  158. #define innerpro3i( p, q )        ( (p).x*(q).x + (p).y*(q).y + (p).z*(q).z )
  159. #define innerpro3p( p, q )        AdjMulDeci( (p).x*(q).x + (p).y*(q).y + (p).z*(q).z )
  160. #define abs3i( p )                ( (int)sqrt( (p).x*(p).x + (p).y*(p).y + (p).z*(p).z ) )
  161. #define Normalize3i( p )        { if( abs3i(p)>0 ) (p)=inscalar3i( abs3i(p) ,scalar3i( DUNIT, (p) ) );}
  162. /* p の大きさをdunitにする */
  163. #define cos3i( p, q )            ( (innerpro3i( p, q ) << DECIMAL) / abs3i(p) / abs3i(q) )
  164. /* p, q のなす角の cos を固定少数で返す */
  165. #define Init3V( p )                { (p).x=0 ; (p).y=0 ; (p).z=0 ;}
  166.  
  167. /*
  168. *        行列演算関数
  169. */
  170. extern struct matrix3i addm3i( struct matrix3i A, struct matrix3i B );
  171. #define addm3p( A, B )            ( addm3i( (A), (B) ) )
  172. extern struct matrix3i subm3i( struct matrix3i A, struct matrix3i B );
  173. #define subm3p( A, B )            ( subm3i( (A), (B) ) )
  174. extern struct matrix3i mulmm3i( struct matrix3i A, struct matrix3i B );
  175. extern struct matrix3p mulmm3p( struct matrix3p A, struct matrix3p B );
  176. extern struct vect3i mulmv3i( struct matrix3i A, struct vect3i p );
  177. extern struct vect3p mulmv3p( struct matrix3p A, struct vect3p p );
  178. extern struct vect3i mulmv3pi( struct matrix3p A, struct vect3i p );
  179. /* 3次元vectorの回転 */
  180. extern struct vect3i RotXi( int a, struct vect3i p );
  181. extern struct vect3p RotXp( int a, struct vect3p p );
  182. extern struct vect3i RotYi( int a, struct vect3i p );
  183. extern struct vect3p RotYp( int a, struct vect3p p );
  184. extern struct vect3i RotZi( int a, struct vect3i p );
  185. extern struct vect3p RotZp( int a, struct vect3p p );
  186. extern struct matrix3p RotX( int a );
  187. extern struct matrix3p RotY( int a );
  188. extern struct matrix3p RotZ( int a );
  189. #define Init3M( A )                { (A).xx=0 ; (A).xy=0 ; (A).xz=0 ; (A).yx=0 ; (A).yy=0 ; (A).yz=0 ; (A).zx=0 ; (A).zy=0 ; (A).zz=0 ; }
  190. /* 平面を表す関数 */
  191. #define surffi( s, p )    ( innerpro3i( (s).norl, (p) ) - (s).c )
  192. #define surffp( s, p )    ( innerpro3p( (s).norl, (p) ) - (s).c )
  193.  
  194. /* end of imath.h */
  195.